<?php
class ReciboCobranzaDetallesController extends AppController {

    var $name = 'ReciboCobranzaDetalles';
    var $appModule = 'Facturacion';
    var $helpers = array('Html', 'Form', 'Javascript', 'Number', 'Time', 'Codigo','GetList');
    var $components = array('RequestHandler', 'Formating');
    var $uses = array('ReciboCobranza','DocumentoVenta', 'CuentaCorrienteCobrar','Alumno');

    function index() {
        //definiciÃ³n de condiciones estÃ¡ndares
        $conditions['ReciboCobranza.activo'] = true;
        $conditions['ReciboCobranza.empresa_id']=$this->_usuario['Tercero']['empresa_id'];
        $conditions['ReciboCobranza.centro_dist_id']=$this->_usuario['Tercero']['centro_dist_id'];
        //verificando si se hizo busqueda por formulario
        $busq = isset($this->params['url']['q'])?$this->params['url']['q']:'';
        $q = $this->getBusqueda($this->data['ReciboCobranza']['busqueda']);
	
        //armando condiciones si q tiene valor
        if(!empty($q)){
            $conditions['OR'] = array(
                'ReciboCobranza.numero_documento'=> $q,
                'ReciboCobranza.numero_documento SIMILAR TO' => "$q%",
                'ReciboCobranza.nombre_cliente SIMILAR TO' => "%$q",
                //'Vendedor.Tercero.razon_social ILIKE' => "%$q%"
            );
			$order=array('ReciboCobranza.id desc');
        } else {
			if($conditions['ReciboCobranza.centro_dist_id']==58){//quita filtro de fecha en vip hotel
				$conditions['ReciboCobranza.periodo_id']=$this->periodoId();
				$order=array('ReciboCobranza.fecha desc');//filtramos por fecha de manera descendiente
			}else{
				$conditions['ReciboCobranza.fecha']=$this->_ejercicio['Actual']['fecha'];
				$order=array('ReciboCobranza.id desc');
			}
        }
		
        $this->paginate['ReciboCobranza'] = array(
			'limit'=>$this->limite,
			'order'=>array('ReciboCobranza.fecha desc','ReciboCobranza.id desc'),
//                'fields'=>array('id','numero_documento'),
			'conditions'=>$conditions,
			'contain' => array(
                                'Vendedore',
				'Moneda.simbolo',
				'ReciboCobranzaDetalle'=>array(
					'CodigoDocumentoReferencia.simbolo',
					'DocumentoReferencia.numero_documento'
				)
			),
			'order'=>$order
        );		
		
        $reciboCobranzas = $this->paginate('ReciboCobranza');
        
        //estableciendo valores para vista
        if(!empty($this->params['url']['limite'])){
                $this->limite = $this->params['url']['limite'];
        }
        $this->data['ReciboCobranza']['pagesize'] = $this->paginate['limite'] = $this->limite;
        $this->data['ReciboCobranza']['busqueda'] = str_replace('|',';',$q);
        $this->set('q',$busq);	
        $this->set('reciboCobranzas',$reciboCobranzas);
        $this->set('limite',$this->limite);
		
    }

    function view($id = null) {
        if (!$id) {
                $this->Session->setFlash(__('Recibo de Cobranza Invalido.', true));
                $this->redirect(array('action'=>'index'));
        }
        $data = $this->ReciboCobranza->find('first', array(
            'conditions'=>array('ReciboCobranza.activo'=>true,'ReciboCobranza.id'=>$id,'ReciboCobranza.centro_dist_id'=>$this->centroDistId()),
            'contain'=>array(
                //'Vendedor'=>array('Tercero'),
                'Familia'=>array('Alumno'=>array('fields'=>'Alumno.codigo')),
                'Moneda',                
                'ReciboCobranzaDetalle'=>array(
                    'DocumentoReferencia'
                )
            )
        ));
        
        $this->loadModel('Tercero');
            $vendedor = $this->Tercero->find('first',array(
                'conditions'=>array('id'=>$data['ReciboCobranza']['vendedor_id']),
                'recursive'=>-1
            ));
            $data['ReciboCobranza']['nombre_vendedor'] = $vendedor['Tercero']['razon_social'];
        
       
        $this->set('reciboCobranza', $data);

        $serie=substr($data['ReciboCobranza']['numero_documento'],0,3);
	///////////////////NAVEGADOR DE DOCUMENTOS////////////////////
        $vecinos=$this->ReciboCobranza->find('neighbors', array(
            'field' => 'ReciboCobranza.numero_documento',
            'value' => $data['ReciboCobranza']['numero_documento'],//$id,
            'fields'=>array('ReciboCobranza.numero_documento'),
            'conditions'=>array(
                'ReciboCobranza.empresa_id'=>$this->empresaId(),
                'ReciboCobranza.centro_dist_id'=>$this->centroDistId(),
                'ReciboCobranza.fecha'=>$this->fechaTrabajo(),
                'ReciboCobranza.anulado'=>false,
                'ReciboCobranza.activo'=>true,
                'substr("ReciboCobranza"."numero_documento",1,3)'=>$serie,
            ),
            'order'=>array('ReciboCobranza.numero_documento'=>'desc'),
        ));
      // printDie($data); 
        $this->set('vecino',$vecinos);

    }

    function add($id = null) {
	$this->verificarFechaTrabajo();
        if (!empty($this->data)) {         
            $this->ReciboCobranza->begin();
            $this->data['ReciboCobranza']['empresa_id'] 		= $this->empresaId();
            $this->data['ReciboCobranza']['centro_dist_id'] 	= $this->centroDistId();
            $this->data['ReciboCobranza']['ejercicio_id'] 		= $this->ejercicioId($this->data['ReciboCobranza']['fecha']);
            $this->data['ReciboCobranza']['periodo_id'] 		= $this->periodoId($this->data['ReciboCobranza']['fecha']);
            $this->data['ReciboCobranza']['activo'] 		= true;
            $this->data['ReciboCobranza']['anulado'] 		= false;
            $this->data['ReciboCobranza']['usuario_creacion_id']    = $this->_usuario['id'];
            $this->data['ReciboCobranza']['fecha_creacion'] 	= 'now()';                           
            # BUSCAMOS SI HAY DOCUMENTOS REPETIDOS
            // ultimo #
            $follow = true;
            $repetidos 	= array();
            $mensaje	= '';
            if(count($this->data['ReciboCobranzaDetalle'])>0){
                foreach($this->data['ReciboCobranzaDetalle'] as $reciboDetalle){
                    if(!empty($reciboDetalle['documento_referencia_id']) && !empty($reciboDetalle['numero_documento_referencia']) && !empty($reciboDetalle['codigo_documento_ref_id'])){							
                        $repetidos[] = $reciboDetalle['documento_referencia_id'];								
                    }
                }
                asort($repetidos);		
                $codigoRepetido = '';					
                foreach($repetidos as $rep=>$cod){
                    if($codigoRepetido==$cod){
                        $this->Session->setFlash('Error: Documento Repetidos en el recibo de cobranza.');
                        $follow = false;	
                        break;
                    }
                    $codigoRepetido=$cod;
                }	 
            }
            if($follow){           
                $numDoc 	= $this->data['ReciboCobranza']['numero_documento'];
                $vendedore	= $this->data['ReciboCobranza']['vendedor_id'];
				$flag = 0;
                $long = strlen(trim($numDoc));
                if ($long > 0 && $long < 3){
                    $this->Session->setFlash('Error: El numero del documento es incorrecto.');
                    $follow = false;
                } else if ($long > 0) {
                	$follow = true;
                }
                $numeroRecibo = trim($this->data['ReciboCobranza']['numero_documento']);
                if(!empty($numeroRecibo)){
                    # validamos si ya existe el documento
                    $follow	 = $follow && $this->verificarRepetidos($numeroRecibo);
                    if(!$follow){
                        $this->Session->setFlash('Error: El numero '.$numeroRecibo.' ya existe.'.$mensaje);
                        $follow = false;	
                    }					
                }
                $this->ReciboCobranza->create();
                if ($follow && $this->ReciboCobranza->save($this->data)) {
                    $reciboId = $this->ReciboCobranza->id;
                    $this->data['ReciboCobranza']['monto_percepcion']	= 0;
                    foreach($this->data['ReciboCobranzaDetalle'] as $detalle){
                        
                        if(!isset($detalle['chk']))
                           continue;
                        
                        if (empty($detalle['codigo_documento_ref_id'])||
                                empty($detalle['documento_referencia_id']))
                            continue;
                        
                        // cuenta corriente cabecera
                        $contado = $detalle['contado'] = $detalle['contado']=='true'?true:false;
                        $cancela = false;
                        $detalle['abono_percepcion'] = 0;

                        if ($follow && !$detalle['contado']){
                            if ($detalle['codigo_documento_ref_id'] != 125){ // comprobando importes
                                $referencia = $this->ReciboCobranza->DocumentoReferencia->find('first',array(
                                    'conditions'=>array('DocumentoReferencia.id'=>$detalle['documento_referencia_id']),
                                    'recursive'=>-1
                                )); // para validar el monto total del documento referencia                                
                                $referencia['DocumentoReferencia']['suma_percepcion'] = empty($referencia['DocumentoReferencia']['suma_percepcion'])?0:$referencia['DocumentoReferencia']['suma_percepcion'];
                                $referencia['DocumentoReferencia']['suma_importe_total'] = empty($referencia['DocumentoReferencia']['suma_importe_total'])?0:$referencia['DocumentoReferencia']['suma_importe_total'];
                                $referencia['DocumentoReferencia']['cargo'] = empty($referencia['DocumentoReferencia']['cargo'])?0:$referencia['DocumentoReferencia']['cargo'];
                                $referencia['DocumentoReferencia']['abono'] = empty($referencia['DocumentoReferencia']['abono'])?0:$referencia['DocumentoReferencia']['abono'];                                
                                $referencia['DocumentoReferencia']['cargo_percepcion'] = empty($referencia['DocumentoReferencia']['cargo_percepcion'])?0:$referencia['DocumentoReferencia']['cargo_percepcion'];
                                $referencia['DocumentoReferencia']['abono_percepcion'] = empty($referencia['DocumentoReferencia']['abono_percepcion'])?0:$referencia['DocumentoReferencia']['abono_percepcion'];

                                // saldo de cta corriente
                                $cargo = number_format($referencia['DocumentoReferencia']['cargo'], 2, '.', '');
								$totalAbono = $referencia['DocumentoReferencia']['abono'] + $detalle['abono'];
                                $abono = number_format($totalAbono, 2, '.', '');
                                $referencia['DocumentoReferencia']['abono'] = $abono;
                                if ($cargo < $abono){
                                    $this->Session->setFlash('Error: El importe abonado supera el cargo actual del documento referencia.');
                                    $follow = false;
                                    break;
                                }

                                // percepcion
                                if ($referencia['DocumentoReferencia']['suma_percepcion'] > 0){
                                    if ($cargo == $abono)
                                        $detalle['abono_percepcion'] = number_format($referencia['DocumentoReferencia']['cargo_percepcion'] - $referencia['DocumentoReferencia']['abono_percepcion'],2,'.','');
                                    else
                                        $detalle['abono_percepcion'] = number_format($detalle['abono'] * $referencia['DocumentoReferencia']['ref_percepcion_total'] / 100, 2, '.', '');

                                    $cargoPerc = number_format($referencia['DocumentoReferencia']['cargo_percepcion'],2,'.','');
                                    $abonoPerc = number_format($referencia['DocumentoReferencia']['abono_percepcion'] + $detalle['abono_percepcion'], 2, '.', '');
                                    $referencia['DocumentoReferencia']['abono_percepcion'] = $abonoPerc;

                                    if ($cargoPerc < $abonoPerc){
                                        $this->Session->setFlash('Error: La percepcion abonada supera el cargo del documento referencia.'.$cargoPerc.'/'.$abonoPerc);
                                        $follow = false;
                                        break;
                                    } 
                                }
                                unset($referencia['DocumentoReferencia']['suma_percepcion']);
                                unset($referencia['DocumentoReferencia']['cargo']);
                                unset($referencia['DocumentoReferencia']['cargo_percepcion']);

                                $cancela = $cargo == $abono;
                                if($cargo == $abono){
                                    $referencia['DocumentoReferencia']['fecha_cancelacion']  = $this->data['ReciboCobranza']['fecha'];
								}else{
                                    $referencia['DocumentoReferencia']['fecha_cancelacion']  = null;
								}
                                if ($follow && !$this->ReciboCobranza->DocumentoReferencia->save($referencia)){
                                    $this->Session->setFlash('Error: No se ha podido actualizar el saldo de cargo y abono del documento referencia.');
                                    $follow = false;
                                    break;
                                }
                                
                            } 
                            else {
                             
                            }
                        }
                        $this->data['ReciboCobranza']['monto_percepcion'] += $detalle['abono_percepcion'];
                        $detalle['cancela'] = $cancela;

                        $detalle['recibo_cobranza_id'] = $reciboId;
						
                        $totalDiferenciaCambio 	= 0;
                        $cargoDiferenciaCambio 	= 0;
                        $abonoDiferenciaCambio 	= 0;
                        $tipoCambioNuevo	= $this->data['ReciboCobranza']['tipo_cambio'];
                        $tipoCambioUltimo	= $this->data['ReciboCobranza']['tipo_cambio_copy'];
                        $diferencia		= true;
                        if(($tipoCambioNuevo <> $tipoCambioUltimo) && ($this->data['ReciboCobranza']['moneda_id']<>1)){
                            $cargoDiferenciaCambio = round($detalle['abono'] * $tipoCambioUltimo,2);
                            $abonoDiferenciaCambio = round($detalle['abono'] * $tipoCambioNuevo,2);
                            $totalDiferenciaCambio = $cargoDiferenciaCambio - $abonoDiferenciaCambio;
                            $diferencia = false;							
                        }
			$this->ReciboCobranza->ReciboCobranzaDetalle->create();
                        if ($this->ReciboCobranza->ReciboCobranzaDetalle->save($detalle)){                            
                            //empezamo a grabar en Cuen.Corr.Cob
                            //verificamos si es CARGO=0 y ABONO!=0
                            if ($follow && !$detalle['contado']){								
                                $follow = $this->CuentaCorrienteCobrar->saveCc(
                                                $this->data['ReciboCobranza']['empresa_id'],
                                                $this->data['ReciboCobranza']['centro_dist_id'],
                                                $this->data['ReciboCobranza']['ejercicio_id'],
                                                $this->data['ReciboCobranza']['periodo_id'],
                                                $this->data['ReciboCobranza']['fecha'],
                                                $detalle['codigo_documento_ref_id'],
                                                $detalle['documento_referencia_id'],
                                                number_format($detalle['abono'],2,'.',''),
                                                $detalle['abono_percepcion'],
                                                false,
                                                111,
                                                $detalle['recibo_cobranza_id'],
                                                $this->data['ReciboCobranza']['numero_documento'],
                                                $this->data['ReciboCobranza']['tipo_cambio'],
                                                $totalDiferenciaCambio
                                            );
                            }
                        } else {
                            $follow = false;
                            break;
                        }
                    }

                    if ($this->data['ReciboCobranza']['monto_percepcion'] > 0)
                        $this->ReciboCobranza->save($this->data);

                   // $this->Asiento->generarAsientoCobranzaDetalle(111, $this->ReciboCobranza->id, $this->_usuario);                    
										
                    if (!$follow){
//                        $this->Session->setFlash('Se ha producido un error al guardar el Recibo de Cobranza.');
                        $this->ReciboCobranza->rollback();
                    } else {
                        #Actualizamos la ultima visita del cliente
                        if(!empty($this->data['Cliente']['codigo']) &&
                                $this->data['Cliente']['codigo'] != str_repeat('0',strlen($this->data['Cliente']['codigo']))){
                            $codigoCliente = $this->data['Cliente']['codigo'];
                            $this->Cliente->lastVisit($codigoCliente,$this->fechaTrabajo());
                        }
                        /*se actualiza el correlativo del vendedor*/
                       /* $this->loadModel('Vendedore');						
                        $this->Vendedore->recursive = -1;                            
                        $vendedor=$this->Vendedore->read(null,$this->data['ReciboCobranza']['vendedor_id']);
                        $vendedor['Vendedore']['ultimo_recibo']=$this->data['ReciboCobranza']['numero_documento'];

                        $this->Vendedore->save($vendedor);*/
                        $this->ReciboCobranza->commit();
                        $this->Session->setFlash('El Recibo de Cobranza ha sido guardado.');						
                        $this->Session->write('ultimoRecibo',array('id'=>$this->ReciboCobranza->id,'numero_documento'=>$this->data['ReciboCobranza']['numero_documento']));
                        $this->redirect(array('action'=>'add',$reciboId ));
                    }
                } else {     
                    $this->ReciboCobranza->validationErrors;                
                    if ($follow) $this->Session->setFlash('Error guardando los datos del recibo de cobranza.');
                        $this->ReciboCobranza->rollback();
                }
            }else{
                $this->ReciboCobranza->rollback();	
            }
        }
        else {
            $this->data['ReciboCobranza']['numero_documento'] = $this->ReciboCobranza->generar_control();
        }        
        $idAnterior = empty($id)?0:$id;
        $this->set('monedas',
                $this->ReciboCobranza->Moneda->find('list',
                        array('fields'=>array('id', 'simbolo'),
                            'order'=>'Moneda.id')));
        $this->set('fecha', $this->_ejercicio['Actual']['fecha']);        
        $this->set('items_recibo_cobranza', 7);
        $this->set('idAnterior', $idAnterior);
    }

    function edit($id = null) {
	$this->verificarFechaTrabajo();
        if (!$id && empty($this->data)) {
            $this->Session->setFlash('Error: Id de Recibo Cobranza invalido');
            $this->redirect(array('action'=>'index'));
        }
        if (!empty($this->data)) {
            $this->ReciboCobranza->begin(); // iniciando la transaccion
            $this->data['ReciboCobranza']['percepcion_id']          = 0; // recibo de percepcion
            $this->data['ReciboCobranza']['usuario_modificacion_id']= $this->_usuario['id']; // de la sesion
            $this->data['ReciboCobranza']['fecha_modificacion']     = 'now()';
            $this->data['ReciboCobranza']['monto_recibido']         = $this->ReciboCobranza->getMontoRecibido($this->data);
            $this->data['ReciboCobranza']['activo']                 = true;
            $this->data['ReciboCobranza']['anulado']                = false;
                
            $contado = false;
            $cancela = false;            
            // ultimo #
            $follow 	= true;
            $repetidos 	= array();
            $mensaje	= '';
            if(count($this->data['ReciboCobranzaDetalle'])>0){
                    foreach($this->data['ReciboCobranzaDetalle'] as $reciboDetalle){
                            if(!empty($reciboDetalle['documento_referencia_id']) && !empty($reciboDetalle['numero_documento_referencia']) && !empty($reciboDetalle['codigo_documento_ref_id'])){							
                                    $repetidos[] = $reciboDetalle['documento_referencia_id'];								
                            }
                    }
                    asort($repetidos);		
                    $codigoRepetido = '';					
                    foreach($repetidos as $rep=>$cod){
                            if($codigoRepetido==$cod){
                                    $this->Session->setFlash('Error: Documento Repetidos en el recibo de cobranza.');
                                    $follow = false;	
                                    break;
                            }
                            $codigoRepetido=$cod;
                    }	 
            }
            if($follow){ 
				
            $numeroDocumento = $this->data['ReciboCobranza']['numero_documento'];
            $vendedore 	=  $this->data['ReciboCobranza']['vendedor_id'];
            $flag 	= 0;
            $mensaje	= '';
            $long = strlen(trim($numeroDocumento));
            if ($long > 0 && $long <= 3){
                $mensaje.= 'Error: El numero del documento es incorrecto.<br />';
                $follow = false;
            }
            # RESTAURAMOS LOS DOCUMENTOS RELACIONADOS
            if ($follow){
                $reciboAnterior = $this->ReciboCobranza->find('first', array(
                    'conditions'=>array('ReciboCobranza.id'=>$this->data['ReciboCobranza']['id']),
                    'contain'=>array(
                        'ReciboCobranzaDetalle'=>array('DocumentoReferencia')
                    )
                ));
		$numeroDocumentoAnterior = $reciboAnterior['ReciboCobranza']['numero_documento'];
                # RESTAURAMOS LOS DOCUMENTOS RELACIONADOS
		foreach ($reciboAnterior['ReciboCobranzaDetalle'] as $detalle){
                    $referencia = array();
                    $convenio = array();
                    $contado = $detalle['contado'];
					if (!$contado){
                        $follow = $follow && $this->CuentaCorrienteCobrar->deleteCc(
                                $detalle['documento_referencia_id'],
                                $detalle['codigo_documento_ref_id'],
                                2,
                                $reciboAnterior['ReciboCobranza']['id'],
                                111);								
                        if(!$follow){
                                $mensaje.= 'Hubo problemas para eliminar la Cuenta Corriente.<br />';
                                $follow  = false;	
                        }

                        if ($detalle['codigo_documento_ref_id']!=125){ // documentos
                            $this->DocumentoVenta->recursive = -1;
                            $doc = $this->DocumentoVenta->read(null,$detalle['documento_referencia_id']);

                            $referencia['id'] = $detalle['documento_referencia_id'];
                            $referencia['abono'] = $doc['DocumentoVenta']['abono'] - $detalle['abono'];
                            //$referencia['abono_percepcion'] = $doc['DocumentoVenta']['abono_percepcion'] - $detalle['abono_percepcion'];
                            $referencia['fecha_cancelacion'] = null;
                            $follow = $follow && $this->DocumentoVenta->save($referencia);
                            if (!$follow){
                                $mensaje.='No se ha podido actualizar el saldo de cargo y abono del documento referencia anterior.<br />';
                                $follow = false;
                                break;
                            }
                        } else {
                            $convenio['id'] = $detalle['documento_referencia_id'];
                            $convenio['pagado'] = false;
                            $convenio['fecha_cancelacion'] = null;
			    /*$follow = $follow && $this->Convenio->save($convenio,false);
                            if(!$follow){
                                $mensaje.= 'Hubo problemas para eliminar la Cuenta Corriente.<br />';
				$follow  = false;	
                                break;
                            }*/
                        }
                    }
                }		
		if ($follow) {
                    //$this->Asiento->restaurarAsientoCobranzaDetalle(111, $this->data['ReciboCobranza']['id'],$this->_usuario);
                    //$this->ComprobantePercepcione->delete(array('ComprobantePercepcione.id'=>$reciboAnterior['ReciboCobranza']['percepcion_id']),false);
                    $this->ReciboCobranza->ReciboCobranzaDetalle->deleteAll(array('ReciboCobranzaDetalle.recibo_cobranza_id'=>$id),false);
                }                
                
            }
            # TERMINAMOS DE RESTAURAR MONTOS			
            # VERIFICAMOS SI YA EXISTE EL DOCUMENTO
            $numeroRecibo = trim($this->data['ReciboCobranza']['numero_documento']);
                    if(!empty($numeroRecibo)){
                            # validamos si ya existe el documento
                            if($numeroDocumentoAnterior!=$numeroRecibo){
                                    $follow	 = $follow && $this->verificarRepetidos($numeroRecibo);
                                    if(!$follow){
                                            $this->Session->setFlash('Error: El numero '.$numeroRecibo.' ya existe.');
                                            $follow = false;	
                                    }	
                            }
                    }
            # ACTUALIZAMOS CON LOS NUEVOS VALORES
            if ($follow) {
                $follow = $follow && $this->ReciboCobranza->save($this->data);
                if(!$follow){
                            $mensaje.= 'Error: El numero del documento es incorrecto.<br />';
                            $follow = false;
                        }
                $reciboId = $this->data['ReciboCobranza']['id'];
                $this->data['ReciboCobranza']['monto_percepcion'] = 0;

                foreach($this->data['ReciboCobranzaDetalle'] as $detalle){

                    if (empty($detalle['codigo_documento_ref_id'])||
                            empty($detalle['documento_referencia_id'])) continue;
                    
                    // cuenta corriente cabecera
                    $contado = $detalle['contado'] = $detalle['contado']=='true'?true:false;
                    $cancela = false;
                    $detalle['abono_percepcion'] = 0;
					$diferenciaCambioEdit = 0;
					if ($follow && !$detalle['contado']){                        
                        if ($detalle['codigo_documento_ref_id'] != 125){ // comprobando importes
						
							$referencia = $this->ReciboCobranza->DocumentoReferencia->find('first',array(
                                'conditions'=>array('DocumentoReferencia.id'=>$detalle['documento_referencia_id']),
                                'recursive'=>-1
                            )); // para validar el monto total del documento referencia							
                            $referencia['DocumentoReferencia']['suma_percepcion'] = empty($referencia['DocumentoReferencia']['suma_percepcion'])?0:$referencia['DocumentoReferencia']['suma_percepcion'];
                            $referencia['DocumentoReferencia']['suma_importe_total'] = empty($referencia['DocumentoReferencia']['suma_importe_total'])?0:$referencia['DocumentoReferencia']['suma_importe_total'];
                            $referencia['DocumentoReferencia']['cargo'] = empty($referencia['DocumentoReferencia']['cargo'])?0:$referencia['DocumentoReferencia']['cargo'];
                            $referencia['DocumentoReferencia']['abono'] = empty($referencia['DocumentoReferencia']['abono'])?0:$referencia['DocumentoReferencia']['abono'];
                            $referencia['DocumentoReferencia']['cargo_percepcion'] = empty($referencia['DocumentoReferencia']['cargo_percepcion'])?0:$referencia['DocumentoReferencia']['cargo_percepcion'];
                            $referencia['DocumentoReferencia']['abono_percepcion'] = empty($referencia['DocumentoReferencia']['abono_percepcion'])?0:$referencia['DocumentoReferencia']['abono_percepcion'];
                            
							$diferenciaCambioEdit =  $referencia['DocumentoReferencia']['tipo_cambio'];
                            // saldo de cta corriente
                            $cargo = number_format($referencia['DocumentoReferencia']['cargo'],2,'.','');
							$totalAbono = $referencia['DocumentoReferencia']['abono'] + $detalle['abono'];
                            $abono = number_format($totalAbono,2,'.','');
                            $referencia['DocumentoReferencia']['abono'] = $abono;
                            if ($cargo < $abono){
                                $this->Session->setFlash('Error: El importe abonado supera el cargo actual del documento referencia.');
                                $follow = false;
                                break;
                            }
                            // percepcion
                            if ($referencia['DocumentoReferencia']['suma_percepcion'] > 0){
                                if ($cargo == $abono)
                                    $detalle['abono_percepcion'] = number_format($referencia['DocumentoReferencia']['cargo_percepcion'] - $referencia['DocumentoReferencia']['abono_percepcion'], 2, '.', '');
                                else
                                    $detalle['abono_percepcion'] = number_format($detalle['abono'] * $referencia['DocumentoReferencia']['ref_percepcion_total'] / 100,2,'.','');
                                
                                $cargoPerc = number_format($referencia['DocumentoReferencia']['cargo_percepcion'],2,'.','');
                                $abonoPerc = number_format($referencia['DocumentoReferencia']['abono_percepcion'] + $detalle['abono_percepcion'],2,'.','');
                                $referencia['DocumentoReferencia']['cargo_percepcion'] = $cargoPerc;
                                $referencia['DocumentoReferencia']['abono_percepcion'] = $abonoPerc;

                                if ($cargoPerc < $abonoPerc){
                                    $this->Session->setFlash('Error: La percepcion abonada supera el cargo del documento referencia.');
                                    $follow = false;
                                    break;
                                }
                            }
                            
                            unset($referencia['DocumentoReferencia']['suma_percepcion']);
                            unset($referencia['DocumentoReferencia']['cargo']);
                            unset($referencia['DocumentoReferencia']['cargo_percepcion']);

                            $cancela = $cargo == $abono;
                            if ($cargo == $abono)
                                $referencia['DocumentoReferencia']['fecha_cancelacion']  = $this->data['ReciboCobranza']['fecha'];
                            else
                                $referencia['DocumentoReferencia']['fecha_cancelacion']  = null;

                            if ($follow && !$this->ReciboCobranza->DocumentoReferencia->save($referencia)){
                                $this->Session->setFlash('Error: No se ha podido actualizar el saldo de cargo y abono del documento referencia.');
                                $follow = false;
                                break;
                            }
                        } else {
                          /*  $convenio = $this->Convenio->find('first', array(
                                'conditions'=>array('Convenio.id'=>$detalle['documento_referencia_id']),
                                'recursive'=>-1
                            ));
			    if ($convenio['Convenio']['suma_importe_total'] != $detalle['abono']){
                                $this->Session->setFlash('Error: El Convenio debe ser cancelado');
                                $follow = false;
                                break;
                            }							
                            $convenio['Convenio']['fecha_cancelacion'] = $this->data['ReciboCobranza']['fecha'];
                            $convenio['Convenio']['pagado'] = true;
                            $cancela = true;
							
			    $follow = $follow && $this->Convenio->save($convenio);
                            if (!$follow){
                                $mensaje.= 'No se ha podido actualizar el saldo de cargo y abono del documento referencia.<br />';
                                $follow = false;
                                break;
                            }*/
                        }
                    }
                    $this->data['ReciboCobranza']['monto_percepcion'] += $detalle['abono_percepcion'];
                    $detalle['cancela'] = $cancela;

                    $detalle['recibo_cobranza_id'] = $reciboId;
					
					# SOLO PARA LA DIFERENCIA DE CAMBIO
					$totalDiferenciaCambio 	= 0;
					$cargoDiferenciaCambio 	= 0;
					$abonoDiferenciaCambio 	= 0;
					$tipoCambioNuevo		= $this->data['ReciboCobranza']['tipo_cambio'];
					$tipoCambioUltimo		= $diferenciaCambioEdit;
					$diferencia				= true;
					if(($tipoCambioNuevo <> $tipoCambioUltimo) && ($this->data['ReciboCobranza']['moneda_id']<>1)){
						$cargoDiferenciaCambio = round($detalle['abono'] * $tipoCambioUltimo,2);
						$abonoDiferenciaCambio = round($detalle['abono'] * $tipoCambioNuevo,2);
						$totalDiferenciaCambio = $cargoDiferenciaCambio - $abonoDiferenciaCambio;
						$diferencia = false;							
					}
					
                    $this->ReciboCobranza->ReciboCobranzaDetalle->create();
                    if ($follow && $this->ReciboCobranza->ReciboCobranzaDetalle->save($detalle)){
                        //empezamo a grabar en Cuen.Corr.Cob
                        //verificamos si es CARGO=0 y ABONO!=0

                        if ($follow && !$detalle['contado']){
                            $follow = $this->CuentaCorrienteCobrar->saveCc(
                                    $this->data['ReciboCobranza']['empresa_id'],
                                    $this->data['ReciboCobranza']['centro_dist_id'],
                                    $this->data['ReciboCobranza']['ejercicio_id'],
                                    $this->data['ReciboCobranza']['periodo_id'],
                                    $this->data['ReciboCobranza']['fecha'],
                                    $detalle['codigo_documento_ref_id'],
                                    $detalle['documento_referencia_id'],
                                    number_format($detalle['abono'],2,'.',''),
                                    $detalle['abono_percepcion'],
                                    false,
                                    111,
                                    $reciboId,
									$this->data['ReciboCobranza']['numero_documento'],
									$this->data['ReciboCobranza']['tipo_cambio'],
									$totalDiferenciaCambio
									);
                        }
                    } else {
                        $follow = false;
                        break;
                    }
                }

                if ($this->data['ReciboCobranza']['monto_percepcion'] > 0){
                    $percepcion = $this->ComprobantePercepcione->generaComprobante(
                            111,
                            $reciboId,
                            $this->_usuario,
                            $this->_ejercicio);
                    if ($percepcion != false){
                        $this->data['ReciboCobranza']['percepcion_id'] = $percepcion;
                        $this->data['ReciboCobranza']['id'] = $reciboId;
                        $follow = $follow && $this->ReciboCobranza->save($this->data);
                    } else {
                        $mensaje.='Se ha producido un error al generar la percepcion.<br />';
                        $follow = false;
                    }
                }
                // asiento de cobranza
             //   $this->Asiento->generarAsientoCobranzaDetalle(111, $reciboId, $this->_usuario);

                if (!$follow){
                    $this->Session->setFlash(__('Hubo problemas: <br />'.$mensaje, true));
                    $this->ReciboCobranza->rollback();
                } else {
                    #Actualizamos la ultima visita del cliente
                    if(!empty($this->data['Cliente']['codigo']) &&
                            $this->data['Cliente']['codigo'] != str_repeat('0',strlen($this->data['Cliente']['codigo']))){
                        $codigoCliente = $this->data['Cliente']['codigo'];
                        $this->Cliente->lastVisit($codigoCliente,$this->fechaTrabajo());
                    }
                    $this->ReciboCobranza->commit();
                    $this->Session->setFlash(__('El Recibo de Cobranza ha sido guardado.', true));
                    $this->redirect(array('action'=>'index'));
                }
            } else {
                    $this->Session->setFlash(__('Hubo problemas: <br />'.$mensaje, true));
                    $this->ReciboCobranza->rollback();
                    }
            }else
		  $this->ReciboCobranza->rollback();	
            
        } 
		# END THIS->DATA
		
            $this->data = $this->ReciboCobranza->find('first',array(
                'fields'=>array('id','empresa_id','centro_dist_id','ejercicio_id','periodo_id','numero_documento',
                    'fecha','vendedor_id','vendedor_origen_id','codigo_documento_ref_id','documento_referencia_id',
                    'familia_id','nombre_cliente','numero_cheque','banco_id','monto_recibido','moneda_id','tipo_cambio',
                    'percepcion_id','monto_percepcion','observaciones','en_ventanilla','monto_credito',
					'detraccion','numero_hoja_coordinacion'
                ),
                'conditions'=>array('ReciboCobranza.id'=>$id),
                'contain'=>array(
                    'Familia'=>array('Alumno'=>array('fields'=>'Alumno.codigo')),
                   // 'Vendedor.codigo',//data[ReciboCobranza][nombre_vendedor]
                    'ReciboCobranzaDetalle'=>array(
                        'DocumentoReferencia'=>array('fields'=>array('numero_documento','fecha_emision'))
                    )
                )
            ));
            
         // veee   AppController::$fechaDocumento = $this->data['ReciboCobranza']['fecha'];
            $this->data['ReciboCobranza']['fecha'] = $this->Formating->fecha($this->data['ReciboCobranza']['fecha']);
            $this->loadModel('Tercero');
            $vendedor = $this->Tercero->find('first',array(
                'conditions'=>array('id'=>$this->data['ReciboCobranza']['vendedor_id']),
                'recursive'=>-1
            ));
            $this->data['ReciboCobranza']['nombre_vendedor'] = $vendedor['Tercero']['razon_social'];
            $this->data['ReciboCobranza']['monto_recibido'] = number_format($this->data['ReciboCobranza']['monto_recibido'],2,'.','');
            foreach($this->data['ReciboCobranzaDetalle'] as $k=>&$detalle){
		if(!empty($detalle['DocumentoReferencia'])){
                	$detalle['numero_documento_referencia'] = $detalle['DocumentoReferencia']['numero_documento'];
                	$this->data['DocumentoReferencia'][$k]['fecha_emision'] = $this->Formating->fecha($detalle['DocumentoReferencia']['fecha_emision']);
		}elseif(!empty($detalle['ConvenioReferencia'])){
			$detalle['numero_documento_referencia'] = $detalle['ConvenioReferencia']['numero_documento'];
                	$this->data['DocumentoReferencia'][$k]['fecha_emision'] = $this->Formating->fecha($detalle['ConvenioReferencia']['fecha_emision']);
		}
                $detalle['cargo'] = number_format($detalle['cargo'],2,'.','');
                $detalle['abono'] = number_format($detalle['abono'],2,'.','');
                $detalle['abono_anterior'] = number_format($detalle['abono_anterior'],2,'.','');
                $detalle['saldo'] = number_format($detalle['cargo']-$detalle['abono_anterior'],2,'.','');
            }     
	
        $this->set('monedas',
                            $this->ReciboCobranza->Moneda->find('list',
                            array('fields'=>array('id', 'simbolo'),
                            'order'=>'Moneda.id')));
        $this->set('fecha', $this->_ejercicio['Actual']['fecha']);        

        if($this->data['ReciboCobranza']['moneda_id']<>1){
                $this->set('items_recibo_cobranza',count($this->data['ReciboCobranzaDetalle']));
        }else{
                $this->set('items_recibo_cobranza', 7);
        }
    }
    
    function report($id = null) {
        if (!$id) {
                $this->Session->setFlash(__('Recibo de Cobranza Invalido.', true));
                $this->redirect(array('action'=>'index'));
        }
        $this->reporte_html();
        $data = $this->ReciboCobranza->find('first', array(
            'conditions'=>array('ReciboCobranza.activo'=>true,'ReciboCobranza.id'=>$id,'ReciboCobranza.centro_dist_id'=>$this->centroDistId()),
            'contain'=>array(                
                'Familia'=>array('Alumno'=>array(
                    'fields'=>array(
                        'Alumno.codigo',
                        'Alumno.grado_id',
                        'Alumno.seccion',
                        'Alumno.nivel_id' ))),
                'Moneda',                
                'ReciboCobranzaDetalle'=>array(
                    'DocumentoReferencia'
                )
            )
        ));
        $total  = number_format($data['ReciboCobranza']['monto_recibido'] , 2, '.', '');
        $moneda = $data['Moneda']['descripcion'];
        $data['ReciboCobranza']['texto'] = strtoupper($this->Formating->curr2letras($total, $moneda));        
        $data['ReciboCobranza']['serie'] = substr($data['ReciboCobranza']['numero_documento'],0,3);
        $data['ReciboCobranza']['numero_documento'] = '000'.substr($data['ReciboCobranza']['numero_documento'],3,6);
        $this->set('reciboCobranza', $data);
    }

    function process(){// procesa anulaciones y eliminaciones en bloque
        //$this->autoRender = false;
        $op = isset($this->params['form']['cancel'])?'anular':'eliminar';
        $flag = true;
        $i = 0;
        foreach($this->data as $item){
            if ($item['id']!='0'){
                if(isset($this->params['form']['cancel'])){ // anular
                    $flag = $this->cancel($item['ReciboCobranza']['id'], false);
                } else { //eliminar
                    $flag = $this->delete($item['ReciboCobranza']['id'], false);
                }
                if (!$flag){
//                    $data = $this->ReciboCobranza->read(null, $item['ReciboCobranza']['id']);
//                    $this->Session->setFlash(__("Se ha producido un error al $op el Recibo de Cobranza #".$data['ReciboCobranza']['numero_documento'], true));
                    break;
                }
                //else echo $item['id'].'<br/>';
            }
            $i++;
        }
        if ($flag && $i > 0){
            $this->Session->setFlash(__("El proceso de $op Recibos de cobranza se ha realizado con exito.", true));
        }
        $this->redirect(array('action'=>'index'));
    }
	
    function cancel($id = null, $verbose = true) {
        if ($id == null) {
            $this->Session->setFlash(__('Id de Recibo de Cobranza invalido', true));
            if ($verbose){                
                $this->redirect(array('action'=>'index'));
            } else return false;
        }
        $recibo = $this->ReciboCobranza->find('first', array(
            'conditions'=>array('ReciboCobranza.id'=>$id),
            'contain'=>array('ReciboCobranzaDetalle')
        ));		
		AppController::$fechaDocumento = $recibo['ReciboCobranza']['fecha'];
		// comprobando que no sea

        if ($recibo['ReciboCobranza']['anulado'] ||
                !$recibo['ReciboCobranza']['activo'] ){
            $msg = 'El Recibo de Cobranza esta en un estado que imposibilita su Anulacion <br>';            
            $this->Session->setFlash($msg);
            if ($verbose){             
                $this->redirect(array('action'=>'index'));
            } else return false;
        }

        $this->ReciboCobranza->begin();
        $follow = true;
        foreach ($recibo['ReciboCobranzaDetalle'] as $data){
            // comprobar si es o no contado la referencia
            if ($data['codigo_documento_ref_id'] == 0)
                $contado = true;
            if ($data['codigo_documento_ref_id'] == 125)
                $contado = false;
             else {
                $this->ReciboCobranza->DocumentoReferencia->recursive = -1;
                $referencia = $this->ReciboCobranza->DocumentoReferencia->read(null, $data['documento_referencia_id']);
                $contado = $referencia['DocumentoReferencia']['fecha_emision'] == $referencia['DocumentoReferencia']['fecha_pago'];
            }
			if (!$contado){
                if ($data['codigo_documento_ref_id'] != 125){
                    // consultando documento referencia para actualizar el abono
                    $this->ReciboCobranza->DocumentoReferencia->recursive = -1;
                    $referencia = $this->ReciboCobranza->DocumentoReferencia->find('first',array(
                        'conditions'=>array('DocumentoReferencia.id'=>$data['documento_referencia_id'])
                    ));
                    $referencia['DocumentoReferencia']['abono'] -= $data['abono'];                    
                    $referencia['DocumentoReferencia']['fecha_cancelacion'] = null;
                    $follow = $follow && $this->ReciboCobranza->DocumentoReferencia->save($referencia);
                    if(!$follow){
                        $follow = false;
                        break;
                    }
                } else {
                    $this->Convenio->recursive = -1;
                    $convenio = $this->Convenio->read(null, $data['documento_referencia_id']);
                    $convenio['Convenio']['pagado'] = false;
                    $convenio['Convenio']['fecha_cancelacion'] = null;
                    $follow = $follow && $this->Convenio->save($convenio);
					if(!$follow){
                        $follow = false;
                        break;
                    }
                }

                $follow = $follow && $this->CuentaCorrienteCobrar->deleteCc(
                        $data['documento_referencia_id'],
                        $data['codigo_documento_ref_id'],
                        2,
                        $recibo['ReciboCobranza']['id'],
                        111);
            }
        }

        $recibo['ReciboCobranza']['activo'] = true;
        $recibo['ReciboCobranza']['anulado'] = true;
        $recibo['ReciboCobranza']['usuario_anulacion_id'] = $this->_usuario['id'];
        $recibo['ReciboCobranza']['fecha_anulacion']='now()';        
        //eliminando el recibo
        $follow = $follow && $this->ReciboCobranza->save($recibo);
        
        if ($follow){
            $this->ReciboCobranza->commit();
            $this->Session->setFlash(__('Recibo de Cobranza eliminado', true));
            if (!$verbose) return true;
        } else {
            $this->ReciboCobranza->rollback();
            if (!$verbose) return false;
        } 
        $this->redirect(array('action'=>'index'));
    }
	
    function delete($id = null, $verbose =true) {
        if ($id == null) {
            if ($verbose){
                $this->Session->setFlash(__('Id de Recibo de Cobranza invalido', true));
                $this->redirect(array('action'=>'index'));
            }
            else return false;
        }
        $recibo = $this->ReciboCobranza->find('first', array(
            'conditions'=>array('ReciboCobranza.id'=>$id),
            'contain'=>array('ReciboCobranzaDetalle')
        ));		
	AppController::$fechaDocumento = $recibo['ReciboCobranza']['fecha'];
        // comprobando que no sea
     
        if ($recibo['ReciboCobranza']['anulado'] ||
                !$recibo['ReciboCobranza']['activo']){
            $msg = 'El Recibo de Cobranza esta en un estado que imposibilita su eliminacion <br>';
            if (!$a) {
                $msg .= '- El Recibo de Cobranza esta cerrado<br>';
            }
            $this->Session->setFlash($msg);
            if ($verbose){
                $this->redirect(array('action'=>'index'));
            } else return false;
        }
        $this->ReciboCobranza->begin();
        $follow = true;
        foreach ($recibo['ReciboCobranzaDetalle'] as $data){
            // comprobar si es o no contado la referencia
            if ($data['codigo_documento_ref_id'] == 0)
                $contado = true;
            if ($data['codigo_documento_ref_id'] == 125)
                $contado = false;				
             else {
				$this->ReciboCobranza->DocumentoReferencia->recursive = -1;
                $referencia = $this->ReciboCobranza->DocumentoReferencia->read(null, $data['documento_referencia_id']);
				$contado = $referencia['DocumentoReferencia']['fecha_emision'] == $referencia['DocumentoReferencia']['fecha_pago'];
            }
			if (!$contado){
				# SI NO ES UN CONVENIO
                if ($data['codigo_documento_ref_id'] != 125){
                    // consultando documento referencia para actualizar el abono
                    $referencia = $this->ReciboCobranza->DocumentoReferencia->find('first',array(
						'recursive'=>-1,
                        'conditions'=>array('DocumentoReferencia.id'=>$data['documento_referencia_id'])
                    ));
					$referencia['DocumentoReferencia']['abono'] -= $data['abono'];
                    $referencia['DocumentoReferencia']['abono_percepcion'] -= $data['abono_percepcion'];
                    $referencia['DocumentoReferencia']['fecha_cancelacion'] = null;
                    $follow = $follow && $this->ReciboCobranza->DocumentoReferencia->save($referencia);
                    if(!$follow){ 
                        $follow = false;
                        break;
                    }
                } else {
                    # SI ES UN CONVENIO
					$this->Convenio->recursive = -1;
                    $convenio = $this->Convenio->read(null, $data['documento_referencia_id']);
                    $convenio['Convenio']['pagado'] = false;
                    $convenio['Convenio']['fecha_cancelacion'] = null;
					$follow = $follow && $this->Convenio->save($convenio);
					if(!$follow){ 
                        $follow = false;
                        break;
                    }
                }				
                $follow = $follow && $this->CuentaCorrienteCobrar->deleteCc(
                        $data['documento_referencia_id'],
                        $data['codigo_documento_ref_id'],
                        2,
                        $recibo['ReciboCobranza']['id'],
                        111);
            }
        }		
		$recibo['ReciboCobranza']['activo'] = false;
        $recibo['ReciboCobranza']['anulado'] = false;
        $recibo['ReciboCobranza']['usuario_borrado_id'] = $this->_usuario['id'];
        $recibo['ReciboCobranza']['fecha_borrado']='now()';		
        //eliminando el recibo
		$follow = $follow && $this->ReciboCobranza->save($recibo);
	
        if ($follow){
            $this->ReciboCobranza->commit();
            $this->Session->setFlash(__('Recibo de Cobranza eliminado', true));
            if (!$verbose) return true;
        } else {
            $this->ReciboCobranza->rollback();
            if (!$verbose) return false;
        } 
        $this->redirect(array('action'=>'index'));
    }

    function ajax(){
    	set_time_limit(0);
        if ($this->RequestHandler->isAjax() && !empty($this->params['form'])) {            
            Configure::write('debug', 0); //quito el debugger
            $this->autoRender = false;//desabilito el auto dibujado
            $this->autoLayout = false;//desabilito el auto layout
            switch ($this->params['form']['action']){
                case 1: // consultar tipo de documento
                    $key = $this->array_regex_find('/^ReciboCobranzaDetalle[0-9]*CodigoDocumentoRefId$/',$this->params['form']);
                    $code = $this->params['form'][$key];
                    if ($code == 101 || $code == 103 || $code == 108 || $code == 125){ // solo boletas o facturas
                        $data = $this->ReciboCobranza->CodigoDocumentoReferencia->find('first',array(
                            'conditions'=>array(
                                    'CodigoDocumentoReferencia.id'=>$code,
                                    'CodigoDocumentoReferencia.activo'=>true
                            ),
                            'fields'=>array('CodigoDocumentoReferencia.id','CodigoDocumentoReferencia.descripcion'),
                            'recurive'=>-1
                        ));
                    }
                    $result = $data['CodigoDocumentoReferencia'];
                    break;
                case 2: // consultar documento
//                    Configure::write('debug', 2); //quito el debugger
                    
                    $key = $this->array_regex_find('/^ReciboCobranzaDetalle[0-9]*CodigoDocumentoRefId$/',$this->params['form']);
                    $code = $this->params['form'][$key];
                    $key = $this->array_regex_find('/^ReciboCobranzaDetalle[0-9]*NumeroDocumentoReferencia$/',$this->params['form']);
                    $number = $this->params['form'][$key];
                    $cliente = isset($this->params['form']['familia_id'])?$this->params['form']['familia_id']:'';
                    $vendedor = isset($this->params['form']['vendedor_id'])?$this->params['form']['vendedor_id']:'';
                    $moneda = isset($this->params['form']['moneda_id'])?$this->params['form']['moneda_id']:$this->_usuario['Empresa']['moneda_id'];
                    $cantidad = isset($this->params['form']['cantidadRows'])?$this->params['form']['cantidadRows']:0;
                     
                    if ($code == 101 || $code == 103 || $code == 108){ // solo boletas o facturas

                        $conditions['DocumentoReferencia.familia_id'] = $this->params['form']['familia_id'];
                        $conditions['DocumentoReferencia.empresa_id'] = $this->empresaId();
                        $conditions['DocumentoReferencia.centro_dist_id'] = $this->centroDistId();
                        $conditions['DocumentoReferencia.activo'] = true;
                        $conditions['DocumentoReferencia.anulado'] = false;
                        $conditions['DocumentoReferencia.impreso'] = true;
                        $conditions['DocumentoReferencia.codigo_documento_id'] = array(101,103,108);
                        $conditions['cast(DocumentoReferencia.codigo_documento_id as varchar(5))'] = $code;
                        if(!empty($number))
                        $conditions['OR'] = array(
                            'DocumentoReferencia.numero_documento'=>$number);
              /*          if ($cantidad > 0)
                            $conditions['DocumentoReferencia.moneda_id'] = $moneda;
                        if ($cantidad != 0 && $cliente != '')
                            $conditions['DocumentoReferencia.familia_id'] = $cliente;
                  */
                        $this->ReciboCobranza->DocumentoReferencia->Behaviors->attach('Containable');
                        $data = $this->ReciboCobranza->DocumentoReferencia->find('all',array(
                            'fields'=>array(
                                'DocumentoReferencia.id',
                                'DocumentoReferencia.fecha_emision',
                                'DocumentoReferencia.fecha_pago',
                                'DocumentoReferencia.codigo_documento_id',
                                'DocumentoReferencia.familia_id',
                                'DocumentoReferencia.nombre_cliente',
                                'DocumentoReferencia.moneda_id',
                                'DocumentoReferencia.tipo_cambio',
                                'DocumentoReferencia.vendedor_id',
                                'DocumentoReferencia.nombre_vendedor',
                                'DocumentoReferencia.vendedor_id',
                                'DocumentoReferencia.ref_percepcion_total',
                                'DocumentoReferencia.suma_importe_total',
                                'DocumentoReferencia.suma_percepcion',
                                'DocumentoReferencia.cargo',
                                'DocumentoReferencia.abono',
                                'DocumentoReferencia.observaciones',
                                'DocumentoReferencia.numero_documento'
                            ),
                            'conditions'=>array_merge($conditions, array('DocumentoReferencia.cargo <> DocumentoReferencia.abono')),
                            'order' => 'DocumentoReferencia.fecha_emision ASC'
                        ));
                    }
                    
                $this->loadModel('Familia');
                if (isset($data['DocumentoReferencia']['id']))
                    $data['DocumentoReferencia']['contado']=
                        $this->Formating->fecha($data['DocumentoReferencia']['fecha_emision']) == 
                        $this->Formating->fecha($data['DocumentoReferencia']['fecha_pago']);

                if(isset($data['DocumentoReferencia']['familia_id'])){
                    $fami = $this->Familia->find('first', array('conditions'=>array('Familia.id'=>$data['DocumentoReferencia']['familia_id'])));                          
                    $data['Familia']['codigo'] = $fami['Familia']['codigo'];
                }
                                    
                if (isset($data['DocumentoReferencia']['id'])){
                    $data['DocumentoReferencia']['cargo'] = number_format($data['DocumentoReferencia']['cargo'], 2, '.', '');
                    $data['DocumentoReferencia']['abono'] = number_format($data['DocumentoReferencia']['abono'], 2, '.', '');
                    $data['DocumentoReferencia']['saldo'] = number_format($data['DocumentoReferencia']['cargo']-$data['DocumentoReferencia']['abono'], 2, '.', '');
                    $data['DocumentoReferencia']['suma_importe_total'] = number_format($data['DocumentoReferencia']['suma_importe_total']+$data['DocumentoReferencia']['suma_percepcion'], 2, '.', '');
                    $data['DocumentoReferencia']['suma_percepcion'] = number_format($data['DocumentoReferencia']['suma_percepcion'], 2, '.', '');

                    $data['DocumentoReferencia']['fecha_emision'] = $this->Formating->fecha($data['DocumentoReferencia']['fecha_emision']);
                }
                $result = $data;
                break;
              
                case 3: // consultar documento
//                    Configure::write('debug', 2); //quito el debugger
                    
                    $key = $this->array_regex_find('/^ReciboCobranzaDetalle[0-9]*CodigoDocumentoRefId$/',$this->params['form']);
                    $code = $this->params['form'][$key];
                    $key = $this->array_regex_find('/^ReciboCobranzaDetalle[0-9]*NumeroDocumentoReferencia$/',$this->params['form']);
                    $number = $this->params['form'][$key];
                    $cliente = isset($this->params['form']['familia_id'])?$this->params['form']['familia_id']:'';
                    $vendedor = isset($this->params['form']['vendedor_id'])?$this->params['form']['vendedor_id']:'';
                    $moneda = isset($this->params['form']['moneda_id'])?$this->params['form']['moneda_id']:$this->_usuario['Empresa']['moneda_id'];
                    $cantidad = isset($this->params['form']['cantidadRows'])?$this->params['form']['cantidadRows']:0;
                     
                    if ($code == 101 || $code == 103 || $code == 108){ // solo boletas o facturas

                        $conditions['DocumentoReferencia.familia_id'] = $this->params['form']['familia_id'];
                        $conditions['DocumentoReferencia.empresa_id'] = $this->empresaId();
                        $conditions['DocumentoReferencia.centro_dist_id'] = $this->centroDistId();
                        $conditions['DocumentoReferencia.activo'] = true;
                        $conditions['DocumentoReferencia.anulado'] = false;
                        $conditions['DocumentoReferencia.impreso'] = true;
                        
                        $conditions['DocumentoReferencia.codigo_documento_id'] = array(101,103,108);
                        $conditions['cast(DocumentoReferencia.codigo_documento_id as varchar(5))'] = $code;
                        if(!empty($number))
                        $conditions['OR'] = array('DocumentoReferencia.numero_documento'=>$number);              
                        $this->ReciboCobranza->DocumentoReferencia->Behaviors->attach('Containable');
                        $data = $this->ReciboCobranza->DocumentoReferencia->find('first',array(
                            'fields'=>array(
                                'DocumentoReferencia.id',
                                'DocumentoReferencia.fecha_emision',
                                'DocumentoReferencia.fecha_pago',
                                'DocumentoReferencia.codigo_documento_id',
                                'DocumentoReferencia.familia_id',
                                'DocumentoReferencia.nombre_cliente',
                                'DocumentoReferencia.moneda_id',
                                'DocumentoReferencia.tipo_cambio',
                                'DocumentoReferencia.vendedor_id',
                                'DocumentoReferencia.nombre_vendedor',
                                'DocumentoReferencia.vendedor_id',
                                'DocumentoReferencia.ref_percepcion_total',
                                'DocumentoReferencia.suma_importe_total',
                                'DocumentoReferencia.suma_percepcion',
                                'DocumentoReferencia.cargo',
                                'DocumentoReferencia.abono',
                                'DocumentoReferencia.observaciones',
                                'DocumentoReferencia.numero_documento'
                            ),
                            'conditions'=>$conditions
                        ));
                    }


                $this->loadModel('Familia');
                if (isset($data['DocumentoReferencia']['id']))
                    $data['DocumentoReferencia']['contado']=
                        $this->Formating->fecha($data['DocumentoReferencia']['fecha_emision']) == 
                        $this->Formating->fecha($data['DocumentoReferencia']['fecha_pago']);

                if(isset($data['DocumentoReferencia']['familia_id'])){
                    $fami = $this->Familia->find('first', array('conditions'=>array('Familia.id'=>$data['DocumentoReferencia']['familia_id'])));                          
                    $data['Familia']['codigo'] = $fami['Familia']['codigo'];
                }
                                    
                if (isset($data['DocumentoReferencia']['id'])){
                    $data['DocumentoReferencia']['cargo'] = number_format($data['DocumentoReferencia']['cargo'], 2, '.', '');
                    $data['DocumentoReferencia']['abono'] = number_format($data['DocumentoReferencia']['abono'], 2, '.', '');
                    $data['DocumentoReferencia']['saldo'] = number_format($data['DocumentoReferencia']['cargo']-$data['DocumentoReferencia']['abono'], 2, '.', '');
                    $data['DocumentoReferencia']['suma_importe_total'] = number_format($data['DocumentoReferencia']['suma_importe_total']+$data['DocumentoReferencia']['suma_percepcion'], 2, '.', '');
                    $data['DocumentoReferencia']['suma_percepcion'] = number_format($data['DocumentoReferencia']['suma_percepcion'], 2, '.', '');
                    $data['DocumentoReferencia']['fecha_emision'] = $this->Formating->fecha($data['DocumentoReferencia']['fecha_emision']);
                }
                $result = $data;
                break;
                
                case 4 :
                        $result = $this->ReciboCobranza->generar_control();
                        break;
                
                case 9 :
                        $sql = '
                                select 
                                    fa.id 		"Alumno__familia_id",
                                    fa.codigo 		"Alumno__familia_codigo",
                                    a.id 		"Alumno__id",
                                    a.codigo 		"Alumno__codigo",
                                    tc.razon_social     "Alumno__descripcion"
                                from apafa.familias fa
                                left join apafa.alumnos a on a.id = fa.alumno_id
                                left join maestros.terceros tc on tc.id = fa.alumno_id
                                where 
                                    fa.activo 
                                and a.activo
                                ';
                        if($this->params['form']['q'] != '%') {
                            $sql .= ' and (a.codigo ilike \''.'%'.$this->params['form']['q'].'%'.'\' or tc.razon_social ilike \''.'%'.$this->params['form']['q'].'%'.'\')';
                        }
                       
                        $result = $this->ReciboCobranza->query($sql); 
                        
                        break;
                        
                case 10 :
                        $sql = '
                                select 
                                    a.id                    "Actividad__id",
                                    a.codigo                "Actividad__codigo",
                                    a.descripcion           "Actividad__descripcion",
                                    COALESCE(ad.importe,0)  "Actividad__importe"
                                from apafa.actividades a 
                                left join apafa.actividad_detalles ad on ad.actividad_id = a.id
                                where 
                                    a.activo
                                and a.es_variable  
                                ';
                        if($this->params['form']['q'] != '%') {
                            $sql .= ' and (a.codigo ilike \''.'%'.$this->params['form']['q'].'%'.'\' or a.descripcion ilike \''.'%'.$this->params['form']['q'].'%'.'\')';
                        }
                       
                        $result = $this->ReciboCobranza->query($sql); 
                        
                        break;
            }
            if ($result){
                $this->header('Content-Type: application/json');
                echo json_encode($result);
            } else echo '';
        }
    }

    function serie(){
        if ($this->RequestHandler->isAjax() && !empty($this->params['form'])) {
            Configure::write('debug', 0); //quito el debugger
            $this->autoRender = false;//desabilito el auto dibujado
            $this->autoLayout = false;//desabilito el auto layout

            $numDoc = $_REQUEST['numerDoc'];
            $vendedor = $_REQUEST['vendedor'];
            $flag = 0;
            $long = strlen(trim($numDoc));
            if ($long < 3){
                if($long == 0)
                    echo "";
                else
                    echo "Numero invalido";
            } else {
                if( $this->Vendedore->validSerial($vendedor, $numDoc) == true )
                    echo $numDoc;
                else
                    echo "Numero invalido";
            }
        }
    }	
	# COMPRABAMOS SI LA FECHA DE TRABAJO NO SE MAYOR A LA DEL SISTEMA	
    private function verificarFechaTrabajo(){
		$result = true;
		$mensaje= '';
		# FECHA DE TRABAJO DE USUARIO
		$usuarioTrabajo 	= $this->fechaTrabajo();
		$usuarioEjercicio	= $this->ejercicioId($usuarioTrabajo);
		$usuarioPeriodo		= $this->periodoId($usuarioTrabajo);		
		# FECHA DE TRABAJO DEL SISTEMA
		$sistemaTrabajo		= date('d/m/Y');
		$sistemaEjercicio 	= $this->ejercicioId($sistemaTrabajo);
		$sistemaPeriodo		= $this->periodoId($sistemaTrabajo);	
		# solo calculamos el aÃ±o
		$usuarioAnio	= explode('/',$usuarioTrabajo);
		$sistemaAnio	= explode('/',$sistemaTrabajo);
		
		if($usuarioAnio[2]>$sistemaAnio[2]){
			$mensaje.= 'No puede Trabajar en un AÃ±o diferente.<br />';
			$this->Session->setFlash(__($mensaje, true));
			$this->redirect(array('action'=>'index'));
		}			
		return true;
	}
	# COMPRABAMOS SI LA FECHA DE TRABAJO NO SE MAYOR A LA DEL SISTEMA	
    private function verificarRepetidos($documento){
		$result 	= true;
		$documento	= trim($documento);		
		$consultar 	= $this->ReciboCobranza->find('first',array(
								'recursive'=>-1,
								'conditions'=>array(
										'ReciboCobranza.empresa_id'=>$this->empresaId(),
										'ReciboCobranza.centro_dist_id'=>$this->centroDistId(),
										'ReciboCobranza.numero_documento'=>$documento,
										'ReciboCobranza.numero_documento <>\'\' ',
							            'ReciboCobranza.numero_documento IS NOT NULL',
										'ReciboCobranza.activo'=>true)
							));
		if(!empty($consultar)){
			$result = false;	
		}		
		return $result;
	}

    public function generarVentaContado($fecha = null, $num_recibo = null, $codigo_alumno = null, $codigo_actividad = null, $importe = 0){
        
        $sql = ' select* from facturacion.generar_venta_contado(\'%1$s\', \'%2$s\', \'%3$s\', %4$d, %5$d, %6$d, \'%7$s\', %8$f); ';
       
        $data = $this->ReciboCobranza->query(sprintf($sql, $codigo_alumno, $codigo_actividad, $fecha, $this->empresaId(), $this->centroDistId(), $this->usuarioId(), $num_recibo, $importe));
        
        if(isset($data[0][0]['generar_venta_contado'])){
            $this->ReciboCobranza->recursive = -1;
            $recibo = $this->ReciboCobranza->find('first', array('conditions'=>array('numero_documento'=>$num_recibo, 'activo'=>true)));
            $this->redirect(array('action'=>'report/'.$recibo['ReciboCobranza']['id']));
        }
        else{
            $this->Session->setFlash(__('ATENCION: Se produjo un error al generar el Documento', true));
            $this->redirect(array('controller'=>'home','action'=>'index'));
        }
    }    
         
}
?>